// async 函数的实现原理，就是将 Generator 函数和自动执行器，包装在一个函数里。
function async(genFn) {
    return new promise((resovle, reject) => {
        const gen = genFn()
        function step(nextFn) {
            let next
            try {
                next = nextFn()
            } catch (err) {
                return reject(err)
            }
            if (next.done) {
                return resovle(next.value)
            }
            Promise.resolve(next.value).then(res => {
                step(() => gen.next(res))
            }, (err) => {
                step(() => gen.throw(err))
            })
        }
        step(() => gen.next())
    })
}